package com.hzit.canal;

import com.alibaba.otter.canal.protocol.CanalEntry;
import com.xpand.starter.canal.annotation.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * 类名：
 * 作者：WF
 * 功能：
 */

@CanalEventListener
@Slf4j
public class MyCanalListener {

	@Autowired
	private StringRedisTemplate redisTemplate;

	//1. 插入操作监听
	// @InsertListenPoint
	public void onEventInsert(CanalEntry.EventType eventType, CanalEntry.RowData rowData) {
		log.info("正在添加数据。。。。");
		//1.1 获取到插入后的数据
		List<CanalEntry.Column> columnsList = rowData.getAfterColumnsList();
		//1.2 遍历添加的数据
		printInfo(columnsList);
	}
	//6. 数据的打印
	private void printInfo(List<CanalEntry.Column> columnList) {
		columnList.stream().forEach(col -> {
			String name = col.getName();
			String value = col.getValue();
			System.out.println(name + ":" + value);
		});
	}
	//2. 修改操作监听
	// @UpdateListenPoint
	public void updateEvent(CanalEntry.RowData rowData) {
		//2.1 获取修改前的数据
		System.out.println("获取修改前的数据：");
		System.out.println("------------------------------------------");
		for (CanalEntry.Column column : rowData.getBeforeColumnsList()) {
			String name = column.getName();         // 列名
			String value = column.getValue();       // 列值
			System.out.println(name + "---->" + value);
		}
		System.out.println("获取修改后的数据：");
		System.out.println("------------------------------------------");
		for (CanalEntry.Column column : rowData.getAfterColumnsList()) {
			String name = column.getName();         // 列名
			String value = column.getValue();       // 列值
			System.out.println(name + "---->" + value);
		}
	}

	//3. 删除操作的监听
	// @DeleteListenPoint
	public void deleteEvent(CanalEntry.EventType eventType,CanalEntry.RowData rowData) {
		//3.1 获取删除前的数据
		System.out.println("正在获取删除前的数据：");
		System.out.println("------------------------------------------");
		for (CanalEntry.Column column : rowData.getBeforeColumnsList()) {
			String name = column.getName();
			String value = column.getValue();
			System.out.println(name +  "----->" + value);

		}
	}
	//4. 自定义事件监听
	@ListenPoint(table = "tb_brand",eventType = {
			CanalEntry.EventType.INSERT,
			CanalEntry.EventType.UPDATE,
			CanalEntry.EventType.DELETE,
	})
	public void customEvent(CanalEntry.EventType eventType,CanalEntry.RowData rowData) {
		switch (eventType){
			case INSERT:
				log.info("正在对表tb_brand进行添加操作！");
				break;
			case UPDATE:
				log.info("正在对表tb_brand进行修改操作！");
				break;
			case DELETE:        // 当执行删除数据中某条记录时，同步到redis中
				syncDataToRedis(rowData);
				break;
		}
	}
	//2. 同步数据到redis中
	private void syncDataToRedis(CanalEntry.RowData rowData) {
		//2.1 得到删除后的数据
		List<CanalEntry.Column> columnList = rowData.getBeforeColumnsList();
		for (CanalEntry.Column column : columnList) {
			String name = column.getName();     // 列名
			if("id".equals(name)){
				String id = column.getValue(); // 得到id字段的值
				redisTemplate.opsForHash().delete("hzit-brands",id);    // 根据当前删除的哪条数据的id从redis中删除此条记录
			}
		}

	}
}
